﻿using MacroprocesosWinForms.Administrador;
using MacroprocesosWinForms.Usuario;
using MacroprocesosWPF.Usuario;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Unimaq.Macroprocesos.LogicaNegocio;

namespace MacroprocesosWinForms
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CargarArbolProcesos();
        }

        internal void CargarArbolProcesos()
        {
            EmpresaBLL empresaBLL = new EmpresaBLL();
            ProcesoBLL procesoBLL = new ProcesoBLL();

            treeMacroprocesos.Nodes.Clear();
            List<Unimaq.Macroprocesos.AccesoDatos.Empresa> listaEmpresa = empresaBLL.Listar();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Empresa e in listaEmpresa)
            {
                TreeNode nodeEmpresa = new TreeNode() { Text = e.NombreEmpresa, Tag = e , ImageIndex = 0 , SelectedImageIndex = 0};

                List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProcesos = procesoBLL.Listar(e);

                foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listaProcesos)
                {
                    TreeNode nodeProceso = new TreeNode() { Text = string.Format("[{0}] - {1}", p.CodigoProceso.Trim(), p.Nombre.Trim()), Tag = p , ImageIndex = 1 , SelectedImageIndex = 1};
                    nodeEmpresa.Nodes.Add(nodeProceso);
                    CargarProceso(nodeProceso);
                }

                treeMacroprocesos.Nodes.Add(nodeEmpresa);
            }

            treeMacroprocesos.ExpandAll();
        }

        private void CargarProceso(TreeNode selectedNodeProceso)
        {
            ProcesoBLL procesoBLL = new ProcesoBLL();
            DocumentoBLL documentoBLL = new DocumentoBLL();
            Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = selectedNodeProceso.Tag != null ? selectedNodeProceso.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso : null;

            if (selectedProceso != null)
            {
                List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProcesos = procesoBLL.Listar(selectedProceso);
                List<Unimaq.Macroprocesos.AccesoDatos.Documento> listaDocumentos = documentoBLL.Listar(selectedProceso);

                if (listaProcesos.Count > 0)
                {
                    foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listaProcesos)
                    {
                        TreeNode nodeProceso = new TreeNode() { Text = string.Format("[{0}] - {1}", p.CodigoProceso.Trim(), p.Nombre.Trim()), Tag = p , ImageIndex = 1 , SelectedImageIndex = 1};
                        selectedNodeProceso.Nodes.Add(nodeProceso);
                        CargarProceso(nodeProceso);
                    }
                }

                if (listaDocumentos.Count > 0)
                {
                    foreach (Unimaq.Macroprocesos.AccesoDatos.Documento d in listaDocumentos)
                    {
                        TreeNode nodeDocumento = new TreeNode() { Text = string.Format("[{0}] - {1}", d.Codigo.Trim(), d.Nombre.Trim()), Tag = d , ImageIndex = 2 , SelectedImageIndex = 2};
                        selectedNodeProceso.Nodes.Add(nodeDocumento);
                    }
                }
            }
        }

        private void treeMacroprocesos_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node != null)
            {
                if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;                    
                    ShowProcesos(selectedEmpresa);

                    panelContainer.Controls.Clear();
                    panelContainer.Controls.Add(ListViewProcesos);
                }
                else if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;
                    btnsubirNivel.Tag = selectedProceso;
                    ShowProcesos(selectedProceso);

                    panelContainer.Controls.Clear();
                    panelContainer.Controls.Add(ListViewProcesos);
                }
                else if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Documento;
                    btnsubirNivel.Tag = selectedDocumento;

                    //abre el documento
                    if (!string.IsNullOrWhiteSpace(selectedDocumento.RutaAcceso))
                    {
                        string fileType = selectedDocumento.RutaAcceso.
                            Substring(selectedDocumento.RutaAcceso.LastIndexOf('.'), 
                            selectedDocumento.RutaAcceso.Length - selectedDocumento.RutaAcceso.LastIndexOf('.'));

                        switch (fileType)
                        {
                            case ".PDF":
                            case ".pdf":
                                PDFViewer iuVisorPDF = new PDFViewer(selectedDocumento.RutaAcceso.Trim());
                                iuVisorPDF.Dock = DockStyle.Fill;

                                panelContainer.Controls.Clear();
                                panelContainer.Controls.Add(iuVisorPDF);
                                break;
                            case ".DOC":
                            case ".doc":
                            case ".DOCX":
                            case ".docx":
                                WordViewer iuVisorWord = new WordViewer();
                                iuVisorWord.LoadDocument(selectedDocumento.RutaAcceso.Trim());
                                iuVisorWord.Dock = DockStyle.Fill;

                                panelContainer.Controls.Clear();
                                panelContainer.Controls.Add(iuVisorWord);
                                break;
                        }                        
                    }
                }
            }
        }

        private List<ListViewItem> GenerarListView(List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista)
        {
            ListViewItem lv;
            List<ListViewItem> result = new List<ListViewItem>();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in lista)
            {
                lv = new ListViewItem()
                {
                    Text = string.Format("{0}\n{1}", p.CodigoProceso.Trim(), p.Nombre.Trim()),
                    ImageIndex = 1,
                    Tag = p, 
                };

                result.Add(lv);
            }

            return result;
        }

        private List<ListViewItem> GenerarListView(List<Unimaq.Macroprocesos.AccesoDatos.Documento> lista)
        {
            ListViewItem lv;
            List<ListViewItem> result = new List<ListViewItem>();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Documento d in lista)
            {
                lv = new ListViewItem()
                {
                    Text = string.Format("{0}\n{1}", d.Codigo.Trim(), d.Nombre.Trim()),
                    ImageIndex = 2,
                    Tag = d
                };

                result.Add(lv);
            }

            return result;
        }

        private List<TreeNode> GetAllNodes(TreeView tree)
        {
            List<TreeNode> result = new List<TreeNode>();
            TreeNodeCollection nodes = tree.Nodes;

            foreach (TreeNode n in nodes)
            {
                SetNode(n, result);
            }

            return result;
        }

        private void SetNode(TreeNode node, List<TreeNode> result)
        {
            result.Add(node);
            foreach (TreeNode tn in node.Nodes)
            {
                SetNode(tn, result);
            }
        }

        private void ShowProcesos(Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa)
        {
            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista = procesoBLL.Listar(selectedEmpresa);
            List<ListViewItem> viewList = GenerarListView(lista);

            ListViewProcesos.Items.Clear();

            foreach (ListViewItem lv in viewList)
            {
                ListViewProcesos.Items.Add(lv);
            }
        }

        private void ShowProcesos(Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso)
        {
            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProceso = procesoBLL.Listar(selectedProceso);
            List<ListViewItem> viewListProceso = GenerarListView(listaProceso);

            Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL documentoBLL = new DocumentoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Documento> listaDocumento = documentoBLL.Listar(selectedProceso);
            List<ListViewItem> viewListDocumento = GenerarListView(listaDocumento);

            ListViewProcesos.Items.Clear();

            foreach (ListViewItem lv in viewListProceso)
            {
                ListViewProcesos.Items.Add(lv);
            }

            foreach (ListViewItem lv in viewListDocumento)
            {
                ListViewProcesos.Items.Add(lv);
            }
        }

        private void ListViewProcesos_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo hit = ListViewProcesos.HitTest(e.Location);

            if (hit.Item != null)
            {
                ListViewItem lv = hit.Item;

                if (lv.Tag != null)
                {
                    List<TreeNode> lista = new List<TreeNode>();

                    if (lv.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Proceso selectedPoceso = lv.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;

                        List<TreeNode> listNodes = GetAllNodes(treeMacroprocesos);                        

                        foreach (TreeNode tn in listNodes)
                        {
                            if (tn.Tag != null)
                            {
                                if (tn.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                                {
                                    Unimaq.Macroprocesos.AccesoDatos.Proceso nodeProceso = tn.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;

                                    if (nodeProceso.CodigoProceso.Trim().Equals(selectedPoceso.CodigoProceso.Trim()) &&
                                        nodeProceso.Nombre.Trim().Equals(selectedPoceso.Nombre.Trim()))
                                    {
                                        lista.Add(tn);
                                    }
                                }
                            }
                        }

                        btnsubirNivel.Tag = selectedPoceso;
                        ShowProcesos(selectedPoceso);
                    }
                    else if (lv.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                    {
                        //abre el documento
                        Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = lv.Tag as Unimaq.Macroprocesos.AccesoDatos.Documento;

                        List<TreeNode> listNodes = GetAllNodes(treeMacroprocesos);

                        foreach (TreeNode tn in listNodes)
                        {
                            if (tn.Tag != null)
                            {
                                if (tn.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                                {
                                    Unimaq.Macroprocesos.AccesoDatos.Documento nodeDocumento = tn.Tag as Unimaq.Macroprocesos.AccesoDatos.Documento;

                                    if (nodeDocumento.Codigo.Trim().Equals(selectedDocumento.Codigo.Trim()) &&
                                        nodeDocumento.Nombre.Trim().Equals(selectedDocumento.Nombre.Trim()))
                                    {
                                        lista.Add(tn);
                                    }
                                }
                            }
                        }

                        if(!string.IsNullOrWhiteSpace(selectedDocumento.RutaAcceso))
                        {
                            string fileType = selectedDocumento.RutaAcceso.
                                                Substring(selectedDocumento.RutaAcceso.LastIndexOf('.'),
                                                selectedDocumento.RutaAcceso.Length - selectedDocumento.RutaAcceso.LastIndexOf('.'));

                            switch (fileType)
                            {
                                case ".PDF":
                                case ".pdf":
                                    PDFViewer iuVisorPDF = new PDFViewer(selectedDocumento.RutaAcceso.Trim());
                                    iuVisorPDF.Dock = DockStyle.Fill;

                                    panelContainer.Controls.Clear();
                                    panelContainer.Controls.Add(iuVisorPDF);
                                    break;
                                case ".DOC":
                                case ".doc":
                                case ".DOCX":
                                case ".docx":
                                    WordViewer iuVisorWord = new WordViewer();
                                    iuVisorWord.LoadDocument(selectedDocumento.RutaAcceso.Trim());
                                    iuVisorWord.Dock = DockStyle.Fill;

                                    panelContainer.Controls.Clear();
                                    panelContainer.Controls.Add(iuVisorWord);
                                    break;
                            } 
                        }

                        btnsubirNivel.Tag = selectedDocumento;
                    }

                    if (lista.Count > 0)
                    {
                        treeMacroprocesos.SelectedNode = lista[0];
                    }
                }
            }
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Alt == true && e.KeyCode == Keys.V)
            {
                LoginAdministrador iuLogin = new LoginAdministrador();
                DialogResult dr = iuLogin.ShowDialog();

                if (dr == DialogResult.OK)
                {
                    PersonaBLL personaBLL = new PersonaBLL();
                    string usuario = iuLogin.Usuario;
                    string password = iuLogin.Password;

                    Unimaq.Macroprocesos.AccesoDatos.Persona userLogin =  personaBLL.Login(usuario, password);

                    if (userLogin != null)
                    {
                        PrincipalAdministrador iuAdministrador = new PrincipalAdministrador(userLogin);
                        this.Hide();
                        iuAdministrador.Show(this);
                    }
                    else
                    {
                        MessageBox.Show("Usuario incorrecto", "Macroprocesos", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                }
            }
        }

        private void btnsubirNivel_Click(object sender, EventArgs e)
        {
            if (btnsubirNivel.Tag != null)
            {
                Unimaq.Macroprocesos.AccesoDatos.Proceso procesoPadre = null;
                List<TreeNode> lista = new List<TreeNode>();

                if (btnsubirNivel.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso =
                        btnsubirNivel.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;

                    Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
                    procesoPadre = procesoBLL.GetProcesoPadre(selectedProceso);
                }
                else if (btnsubirNivel.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = 
                        btnsubirNivel.Tag as Unimaq.Macroprocesos.AccesoDatos.Documento;

                    Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
                    procesoPadre = procesoBLL.GetProceso(selectedDocumento);
                }

                if (procesoPadre != null)
                {
                    btnsubirNivel.Tag = procesoPadre;

                    List<TreeNode> listNodes = GetAllNodes(treeMacroprocesos);

                    foreach (TreeNode tn in listNodes)
                    {
                        if (tn.Tag != null)
                        {
                            if (tn.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                            {
                                Unimaq.Macroprocesos.AccesoDatos.Proceso nodeProceso = tn.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;

                                if (nodeProceso.CodigoProceso.Trim().Equals(procesoPadre.CodigoProceso.Trim()) &&
                                    nodeProceso.Nombre.Trim().Equals(procesoPadre.Nombre.Trim()))
                                {
                                    lista.Add(tn);
                                }
                            }
                        }
                    }

                    if (lista.Count > 0)
                    {
                        treeMacroprocesos.SelectedNode = lista[0];
                    }

                    ShowProcesos(procesoPadre);
                    panelContainer.Controls.Clear();
                    panelContainer.Controls.Add(ListViewProcesos);
                }
                else
                {
                    //seleccionamos la primera empresa registrada
                    if (treeMacroprocesos.Nodes.Count > 0)
                    {
                        TreeNode firstNode = treeMacroprocesos.Nodes[0];

                        if (firstNode.Tag != null)
                        {
                            if (firstNode.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                            {
                                Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa =
                                    firstNode.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;

                                ShowProcesos(selectedEmpresa);

                                panelContainer.Controls.Clear();
                                panelContainer.Controls.Add(ListViewProcesos);

                                treeMacroprocesos.SelectedNode = firstNode;
                            }
                        }
                    }
                }
            }
        }

        private void btnInicio_Click(object sender, EventArgs e)
        {
            //seleccionamos la primera empresa registrada
            if (treeMacroprocesos.Nodes.Count > 0)
            {
                TreeNode firstNode = treeMacroprocesos.Nodes[0];

                if (firstNode.Tag != null)
                {
                    if (firstNode.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa =
                            firstNode.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;

                        ShowProcesos(selectedEmpresa);

                        panelContainer.Controls.Clear();
                        panelContainer.Controls.Add(ListViewProcesos);

                        treeMacroprocesos.SelectedNode = firstNode;
                    } 
                }
            }
        }

        private void btnsubirNivel_MouseHover(object sender, EventArgs e)
        {
            toolTipUsuario.SetToolTip(btnsubirNivel, "Subir Nivel");
        }

        private void btnInicio_MouseHover(object sender, EventArgs e)
        {
            toolTipUsuario.SetToolTip(btnInicio, "Inicio");
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
    }
}
